package net.ufrog.common.web;

import net.ufrog.common.exception.ServiceException;
import net.ufrog.common.utils.Files;

import java.io.*;

/**
 * 请求文件
 *
 * @author ultrafrog, ufrog.net@gmail.com
 * @version 0.1, 2016-08-04
 * @since 0.1
 */
public class RequestFile implements Serializable {

    private static final long serialVersionUID = 6597140114445990309L;

    /** 文件名 */
    private final String filename;

    /** 原生文件名 */
    private final String originalFilename;

    /** 文件大小 */
    private final Long size;

    /** 输入流 */
    private final InputStream inputStream;

    /**
     * 构造函数
     *
     * @param filename 文件名称
     * @param originalFilename 原始名称
     * @param size 大小
     * @param inputStream 输入流
     */
    public RequestFile(String filename, String originalFilename, Long size, InputStream inputStream) {
        this.filename = filename;
        this.originalFilename = originalFilename;
        this.size = size;
        this.inputStream = inputStream;
    }

    /**
     * 读取文件名
     *
     * @return 文件名
     */
    public String getFilename() {
        return filename;
    }

    /**
     * 读取原生文件名
     *
     * @return 原生文件名
     */
    public String getOriginalFilename() {
        return originalFilename;
    }

    /**
     * 读取扩展名
     *
     * @return 扩展名
     */
    public String getExt() {
        return Files.getExt(getOriginalFilename());
    }

    /**
     * 读取扩展类型
     *
     * @return 扩展类型
     */
    public String getMimeType() {
        return Files.getMimeType(getOriginalFilename());
    }

    /**
     * 读取文件大小<br>
     * 单位为字节
     *
     * @return 文件大小
     */
    public Long getSize() {
        return size;
    }

    /**
     * 读取文件字节数组
     *
     * @return 文件字节数组
     */
    public byte[] getBytes() {
        try {
            byte[] data = new byte[inputStream.available()];
            inputStream.read(data);
            return data;
        } catch (IOException e) {
            throw new ServiceException(e.getMessage(), e);
        }
    }

    /**
     * 读取输入流
     *
     * @return 输入流
     */
    public InputStream getInputStream() {
        return inputStream;
    }

    /**
     * 转移文件
     *
     * @param dest 目标文件
     */
    public void transferTo(File dest) {
        try (FileOutputStream fos = new FileOutputStream(dest)) {
            fos.write(getBytes());
        } catch (IOException e) {
            throw new ServiceException(e.getMessage(), e);
        }
    }
}
